home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xlock / qix.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  4KB  |  141 lines

  1. #ifndef lint
  2. static char sccsid[] = "@(#)qix.c    23.8 91/05/24 XLOCK";
  3. #endif
  4. /*-
  5.  * qix.c - Vector swirl for xlock, the X Window System lockscreen.
  6.  *
  7.  * Copyright (c) 1991 by Patrick J. Naughton.
  8.  *
  9.  * See xlock.c for copying information.
  10.  *
  11.  * Revision History:
  12.  * 29-Jul-90: support for multiple screens.
  13.  *          made check_bounds_?() a macro.
  14.  *          fixed initial parameter setup.
  15.  * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors.
  16.  * 08-Oct-89: Fixed bug in memory allocation in initqix().
  17.  *          Moved seconds() to an extern.
  18.  * 23-Sep-89: Switch to random() and fixed bug w/ less than 4 lines.
  19.  * 20-Sep-89: Lint.
  20.  * 24-Mar-89: Written.
  21.  */
  22.  
  23. #include "xlock.h"
  24.  
  25. typedef struct {
  26.     int         x;
  27.     int         y;
  28. }           point;
  29.  
  30. typedef struct {
  31.     int         pix;
  32.     long        startTime;
  33.     int         first;
  34.     int         last;
  35.     int         dx1;
  36.     int         dy1;
  37.     int         dx2;
  38.     int         dy2;
  39.     int         x1;
  40.     int         y1;
  41.     int         x2;
  42.     int         y2;
  43.     int         offset;
  44.     int         delta;
  45.     int         width;
  46.     int         height;
  47.     int         nlines;
  48.     point      *lineq;
  49. }           qixstruct;
  50.  
  51. static qixstruct qixs[MAXSCREENS];
  52.  
  53. void
  54. initqix(win)
  55.     Window      win;
  56. {
  57.     XWindowAttributes xgwa;
  58.     qixstruct  *qp = &qixs[screen];
  59.  
  60.     qp->startTime = seconds();
  61.     qp->nlines = (batchcount + 1) * 2;
  62.     if (!qp->lineq) {
  63.     qp->lineq = (point *) malloc(qp->nlines * sizeof(point));
  64.     memset(qp->lineq, '\0', qp->nlines * sizeof(point));
  65.     }
  66.  
  67.     XGetWindowAttributes(dsp, win, &xgwa);
  68.     qp->width = xgwa.width;
  69.     qp->height = xgwa.height;
  70.     qp->delta = 16;
  71.  
  72.     if (qp->width < 100) {    /* icon window */
  73.     qp->nlines /= 4;
  74.     qp->delta /= 4;
  75.     }
  76.     qp->offset = qp->delta / 3;
  77.     qp->last = 0;
  78.     qp->pix = 0;
  79.     qp->dx1 = random() % qp->delta + qp->offset;
  80.     qp->dy1 = random() % qp->delta + qp->offset;
  81.     qp->dx2 = random() % qp->delta + qp->offset;
  82.     qp->dy2 = random() % qp->delta + qp->offset;
  83.     qp->x1 = random() % qp->width;
  84.     qp->y1 = random() % qp->height;
  85.     qp->x2 = random() % qp->width;
  86.     qp->y2 = random() % qp->height;
  87.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  88.     XFillRectangle(dsp, win, Scr[screen].gc, 0, 0, qp->width, qp->height);
  89. }
  90.  
  91. #define check_bounds(qp, val, del, max)                \
  92. {                                \
  93.     if ((val) < 0) {                        \
  94.     *(del) = (random() % (qp)->delta) + (qp)->offset;    \
  95.     } else if ((val) > (max)) {                    \
  96.     *(del) = -(random() % (qp)->delta) - (qp)->offset;    \
  97.     }                                \
  98. }
  99.  
  100. void
  101. drawqix(win)
  102.     Window      win;
  103. {
  104.     qixstruct  *qp = &qixs[screen];
  105.  
  106.     qp->first = (qp->last + 2) % qp->nlines;
  107.  
  108.     qp->x1 += qp->dx1;
  109.     qp->y1 += qp->dy1;
  110.     qp->x2 += qp->dx2;
  111.     qp->y2 += qp->dy2;
  112.     check_bounds(qp, qp->x1, &qp->dx1, qp->width);
  113.     check_bounds(qp, qp->y1, &qp->dy1, qp->height);
  114.     check_bounds(qp, qp->x2, &qp->dx2, qp->width);
  115.     check_bounds(qp, qp->y2, &qp->dy2, qp->height);
  116.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  117.     XDrawLine(dsp, win, Scr[screen].gc,
  118.           qp->lineq[qp->first].x, qp->lineq[qp->first].y,
  119.           qp->lineq[qp->first + 1].x, qp->lineq[qp->first + 1].y);
  120.     if (!mono && Scr[screen].npixels > 2) {
  121.     XSetForeground(dsp, Scr[screen].gc, Scr[screen].pixels[qp->pix]);
  122.     if (++qp->pix >= Scr[screen].npixels)
  123.         qp->pix = 0;
  124.     } else
  125.     XSetForeground(dsp, Scr[screen].gc, WhitePixel(dsp, screen));
  126.  
  127.     XDrawLine(dsp, win, Scr[screen].gc, qp->x1, qp->y1, qp->x2, qp->y2);
  128.  
  129.     qp->lineq[qp->last].x = qp->x1;
  130.     qp->lineq[qp->last].y = qp->y1;
  131.     qp->last++;
  132.     if (qp->last >= qp->nlines)
  133.     qp->last = 0;
  134.  
  135.     qp->lineq[qp->last].x = qp->x2;
  136.     qp->lineq[qp->last].y = qp->y2;
  137.     qp->last++;
  138.     if (qp->last >= qp->nlines)
  139.     qp->last = 0;
  140. }
  141.